//请求函数:登录请求函数、退出登录的请求函数、获取用户信息请求函数
import { login, logout, getInfo } from '@/api/acl/user'
//持久化存储token
import { getToken, setToken, removeToken } from '@/utils/auth'
//路由提供的函数:引入常量路由、引入异步路由、引入任意路由
import router, { resetRouter, constantRoutes, asyncRoutes, anyRoute } from '@/router'

const getDefaultState = () => {
  return {
    //令牌
    token: getToken(),
    //用户名字
    name: '',
    //用户头像
    avatar: '',
    //按钮的权限数据:数组
    buttons: [],
    //服务器异步路由信息
    routes: [],
    //角色信息
    roles: [],
    //不同用户动态计算出来的路由结果
    userResultRoute: []
  }
}
//用于筛选出当前用户到底有哪些异步路由
const findUserAscyRoute = (asyncRoutes, routes) => {
  //过滤出当前用户到底有哪些异步路由
  let result = asyncRoutes.filter(item => {
    //代表当前异步路由用户是有的
    if (routes.indexOf(item.name) != -1) {
        //二级、三级、四级、五级、六级、七级、八级、N级
       if(item.children && item.children.length>0){
            //右侧将子路由的结果筛选出来,但是需要注意，一级路由children需要重新赋值[计算之后的结果]
           item.children = findUserAscyRoute(item.children,routes)
       }
      return true;
    }
  })
  return result;
}
//存储state
const state = getDefaultState();

//修改数据mutation
const mutations = {
  RESET_STATE: (state) => {
    Object.assign(state, getDefaultState())
  },
  //存储token
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  //用户信息
  SET_USERINFO: (state, user) => {
    //存储用户名
    state.name = user.name;
    //存储用户头像
    state.avatar = user.avatar;
    //存储用户角色信息
    state.roles = user.roles;
    //存储服务器返回异步路由信息
    state.routes = user.routes;
    //存储按钮权限信息
    state.buttons = user.buttons;
  },
  //用来计算出当前用户全部的路由的结果
  SET_USERRESULTROUTE: (state, asyncResult) => {
    //  console.log(constantRoutes,'常量路由');
    //  console.log(anyRoute,'任意路由');
    //  console.log(asyncResult,'异步路由的结果');
     //保存一下最终的计算的结果
     state.userResultRoute = state.userResultRoute.concat(constantRoutes,asyncResult,anyRoute);
     //目前项目:只有常量路由
     //动态添加路由
     router.addRoutes(state.userResultRoute);
  }
}

//处理action地方
const actions = {
  //登录
  async login({ commit, state, dispatch }, userInfo) {
    //解构出用户名与密码
    const { username, password } = userInfo;
    //整个项目见到token地方,登录接口
    let response = await login({ username: username.trim(), password: password });
    if (response.code === 20000) {
      const { data } = response
      //仓库存储token
      commit('SET_TOKEN', data.token);
      //潘家成是通过cookie持久化存储token,咱们当年是通过本地存储持家化存储的!!
      setToken(data.token);
      return 'ok';
    } else {
      return Promise.reject();
    }
  },

  //获取用户信息
  async getInfo({ commit, state }) {
    //当登录成login->home:守卫能检测到(全局守卫),会获取用户信息
    //获取用户信息的时候,起始不同用户的权限就已经知道了
    //不同用户信息：包含当前用户的异步路由信息,不用包含常量路由信息、任意路由信息【死的】
    let response = await getInfo(state.token);
    if (response.code == 20000) {
      const { data } = response;
      //获取用户名、头像、按钮权限、菜单的权限、角色信息
      commit('SET_USERINFO', data);
      //计算出当前用户的全部路由结果:右侧这里是一个函数[当前项目中异步路由]  第二个参数：服务器返回数组标记数组
      commit('SET_USERRESULTROUTE', findUserAscyRoute(asyncRoutes, data.routes));
      return 'ok';
    } else {
      return Promise.reject(new Error());
    }
  },

  //退出登录
  logout({ commit, state }) {
    return new Promise((resolve, reject) => {
      logout(state.token).then(() => {
        removeToken() // must remove  token  first
        resetRouter()
        commit('RESET_STATE')
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      removeToken() // must remove  token  first
      commit('RESET_STATE')
      resolve()
    })
  }
}

export default {
  //命名空间
  namespaced: true,
  state,
  mutations,
  actions
}

